diff --git a/system/codeigniter/Base4.php b/system/codeigniter/Base4.php
new file mode 100644
index 0000000..5d945c2
--- /dev/null
+++ b/system/codeigniter/Base4.php
@@ -0,0 +1,58 @@
+<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * Code Igniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		Rick Ellis
+ * @copyright	Copyright (c) 2006, pMachine, Inc.
+ * @license		http://www.codeignitor.com/user_guide/license.html 
+ * @link		http://www.codeigniter.com
+ * @since		Version 1.3
+ * @filesource
+ */
+ 
+// ------------------------------------------------------------------------
+
+/**
+ * CI_BASE - For PHP 4
+ * 
+ * This file is used only when Code Igniter is being run under PHP 4.  
+ * Since PHP 4 has such poor object handling we had to come up with 
+ * a hack to resolve some scoping problems.  PHP 5 doesn't suffer from 
+ * this problem so we load one of two files based on the version of 
+ * PHP being run.
+ * 
+ * @package		CodeIgniter
+ * @subpackage	codeigniter
+ * @category	front-controller
+ * @author		Rick Ellis
+ * @link		http://www.codeigniter.com/user_guide/
+ */
+ class CI_Base extends CI_Loader {
+
+	function CI_Base()
+	{
+		global $OBJ; 
+		parent::CI_Loader();
+		$this->load =& $this;
+		$OBJ = $this->load;
+	}
+}
+
+function &get_instance()
+{
+	global $OBJ, $CI;
+	
+	if (is_object($CI))
+	{
+		return $CI;
+	}
+	else
+	{
+		return $OBJ->load;
+	}
+}
+
+?>
\ No newline at end of file
diff --git a/system/codeigniter/Base5.php b/system/codeigniter/Base5.php
new file mode 100644
index 0000000..ef3fc67
--- /dev/null
+++ b/system/codeigniter/Base5.php
@@ -0,0 +1,62 @@
+<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * Code Igniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		Rick Ellis
+ * @copyright	Copyright (c) 2006, pMachine, Inc.
+ * @license		http://www.codeignitor.com/user_guide/license.html 
+ * @link		http://www.codeigniter.com
+ * @since		Version 1.3
+ * @filesource
+ */
+ 
+ 
+// ------------------------------------------------------------------------
+
+/**
+ * CI_BASE - For PHP 5
+ * 
+ * This file contains some code used only when Code Igniter is being
+ * run under PHP 5.  It allows us to manage the CI super object more
+ * gracefully than what is possible with PHP 4.
+ * 
+ * @package		CodeIgniter
+ * @subpackage	codeigniter
+ * @category	front-controller
+ * @author		Rick Ellis
+ * @link		http://www.codeigniter.com/user_guide/
+ */
+
+class CI_Base {
+
+	public function CI_Base()
+	{
+		$instance =& _load_class('Instance');
+		$instance->set_instance($this);
+	}
+}
+
+class Instance {
+	public static $instance;
+
+	public function set_instance(&$object)
+	{
+		self::$instance =& $object;
+	}
+	
+	public function &get_instance()
+	{
+		return self::$instance;
+	}
+}
+
+function &get_instance()
+{
+	$instance =& _load_class('Instance');
+	return $instance->get_instance();	
+}
+
+?>
\ No newline at end of file
diff --git a/system/codeigniter/CodeIgniter.php b/system/codeigniter/CodeIgniter.php
new file mode 100644
index 0000000..aef7618
--- /dev/null
+++ b/system/codeigniter/CodeIgniter.php
@@ -0,0 +1,256 @@
+<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * Code Igniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		Rick Ellis
+ * @copyright	Copyright (c) 2006, pMachine, Inc.
+ * @license		http://www.codeignitor.com/user_guide/license.html 
+ * @link		http://www.codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+ 
+// ------------------------------------------------------------------------
+
+/**
+ * System Front Controller
+ *
+ * Loads the base classes and executes the request. 
+ * 
+ * @package		CodeIgniter
+ * @subpackage	codeigniter
+ * @category	Front-controller
+ * @author		Rick Ellis
+ * @link		http://www.codeigniter.com/user_guide/
+ */
+ 
+define('APPVER', '1.4');
+
+/*
+ * ------------------------------------------------------
+ *  Load the global functions
+ * ------------------------------------------------------
+ */
+require(BASEPATH.'codeigniter/Common'.EXT);
+
+/*
+ * ------------------------------------------------------
+ *  Define a custom error handler so we can log errors
+ * ------------------------------------------------------
+ */
+set_error_handler('_exception_handler');
+set_magic_quotes_runtime(0); // Kill magic quotes
+
+/*
+ * ------------------------------------------------------
+ *  Start the timer... tick tock tick tock...
+ * ------------------------------------------------------
+ */
+
+$BM =& _load_class('CI_Benchmark');
+$BM->mark('code_igniter_start');
+
+/*
+ * ------------------------------------------------------
+ *  Instantiate the hooks classe
+ * ------------------------------------------------------
+ */
+
+$EXT =& _load_class('CI_Hooks');
+
+/*
+ * ------------------------------------------------------
+ *  Is there a "pre_system" hook?
+ * ------------------------------------------------------
+ */
+if ($EXT->_hook_exists('pre_system'))
+{
+	$EXT->_call_hook('pre_system');
+}
+
+/*
+ * ------------------------------------------------------
+ *  Instantiate the base classes
+ * ------------------------------------------------------
+ */
+
+$CFG =& _load_class('CI_Config');
+$RTR =& _load_class('CI_Router');
+$OUT =& _load_class('CI_Output');
+
+/*
+ * ------------------------------------------------------
+ *	Is there a valid cache file?  If so, we're done...
+ * ------------------------------------------------------
+ */
+ 
+if ($EXT->_hook_exists('cache_override'))
+{
+	$EXT->_call_hook('cache_override');
+}
+else
+{
+	if ($OUT->_display_cache() == TRUE)
+	{
+		exit;
+	}
+}
+
+/*
+ * ------------------------------------------------------
+ *  Does the requested controller exist?
+ * ------------------------------------------------------
+ */
+if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_class().EXT))
+{
+	show_404();
+}
+
+/*
+ * ------------------------------------------------------
+ *  Load the remaining base classes
+ * ------------------------------------------------------
+ */
+
+$IN		=& _load_class('CI_Input');
+$URI	=& _load_class('CI_URI');
+$LANG	=& _load_class('CI_Language');
+
+/*
+ * ------------------------------------------------------
+ *  Load the app controller and local controller
+ * ------------------------------------------------------
+ * 
+ *  Note: Due to the poor object handling in PHP 4 we'll
+ *  contditionally load different versions of the base
+ *  class.  Retaining PHP 4 compatibility requires a bit of a hack.
+ *
+ *  Note: The Loader class needs to be included first
+ * 
+ */
+ 
+ 
+_load_class('CI_Loader'); 
+  
+if (floor(phpversion()) < 5)
+{
+	require(BASEPATH.'codeigniter/Base4'.EXT);
+}
+else
+{
+	require(BASEPATH.'codeigniter/Base5'.EXT);
+}
+
+_load_class('CI_Controller'); 
+
+require(APPPATH.'controllers/'.$RTR->fetch_class().EXT);
+
+/*
+ * ------------------------------------------------------
+ *  Security check
+ * ------------------------------------------------------
+ * 
+ *  None of the functions in the app controller or the
+ *  loader class can be called via the URI, nor can 
+ *  controller functions that begin with an underscore
+ */
+$class  = $RTR->fetch_class();
+$method = $RTR->fetch_method();
+
+if ( ! class_exists($class)
+	OR $method == 'controller'
+	OR substr($method, 0, 1) == '_' 
+	OR in_array($method, get_class_methods('Controller'))
+	)
+{
+	show_404();
+}
+
+/*
+ * ------------------------------------------------------
+ *  Is there a "pre_controller" hook?
+ * ------------------------------------------------------
+ */
+if ($EXT->_hook_exists('pre_controller'))
+{
+	$EXT->_call_hook('pre_controller');
+}
+
+/*
+ * ------------------------------------------------------
+ *  Instantiate the controller and call requested method
+ * ------------------------------------------------------
+ */
+$CI = new $class();
+
+if ($RTR->scaffolding_request === TRUE)
+{
+	if ($EXT->_hook_exists('scaffolding_override'))
+	{
+		$EXT->_call_hook('scaffolding_override');
+	}
+	else
+	{
+		$CI->_ci_scaffolding();
+	}
+}
+else
+{
+	if ( ! method_exists($CI, $method))
+	{
+		show_404();
+	}
+	
+	$CI->$method();
+}
+
+/*
+ * ------------------------------------------------------
+ *  Is there a "post_controller" hook?
+ * ------------------------------------------------------
+ */
+if ($EXT->_hook_exists('post_controller'))
+{
+	$EXT->_call_hook('post_controller');
+}
+
+/*
+ * ------------------------------------------------------
+ *  Send the final rendered output to the browser
+ * ------------------------------------------------------
+ */
+ 
+if ($EXT->_hook_exists('display_override'))
+{
+	$EXT->_call_hook('display_override');
+}
+else
+{
+	$OUT->_display();
+}
+
+/*
+ * ------------------------------------------------------
+ *  Is there a "post_system" hook?
+ * ------------------------------------------------------
+ */
+if ($EXT->_hook_exists('post_system'))
+{
+	$EXT->_call_hook('post_system');
+}
+
+/*
+ * ------------------------------------------------------
+ *  Close the DB connection of one exists
+ * ------------------------------------------------------
+ */
+if ($CI->_ci_is_loaded('db'))
+{
+	$CI->db->close();
+}
+
+
+?>
\ No newline at end of file
diff --git a/system/codeigniter/Common.php b/system/codeigniter/Common.php
new file mode 100644
index 0000000..2ec1c3d
--- /dev/null
+++ b/system/codeigniter/Common.php
@@ -0,0 +1,238 @@
+<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * Code Igniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		Rick Ellis
+ * @copyright	Copyright (c) 2006, pMachine, Inc.
+ * @license		http://www.codeignitor.com/user_guide/license.html 
+ * @link		http://www.codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+ 
+// ------------------------------------------------------------------------
+
+/**
+ * Common Functions
+ *
+ * Loads the base classes and executes the request. 
+ * 
+ * @package		CodeIgniter
+ * @subpackage	codeigniter
+ * @category	Common Functions
+ * @author		Rick Ellis
+ * @link		http://www.codeigniter.com/user_guide/
+ */
+ 
+// ------------------------------------------------------------------------
+
+/**
+* Class registry
+*
+*
+* @access	public
+* @return	object
+*/
+function &_load_class($class, $instantiate = TRUE)
+{
+	static $objects;
+	
+	if ( ! isset($objects[$class]))
+	{
+		if (FALSE !== strpos($class, 'CI_'))
+		{
+			if (file_exists(APPPATH.'libraries/'.str_replace('CI_', '', $class).EXT))
+			{
+				require(APPPATH.'libraries/'.str_replace('CI_', '', $class).EXT);	
+			}
+			else
+			{
+				require(BASEPATH.'libraries/'.str_replace('CI_', '', $class).EXT);	
+			}
+		}
+	
+		if ($instantiate == TRUE)
+		{
+			if ($class == 'CI_Controller')
+				$class = 'Controller';
+				
+			$objects[$class] =& new $class();
+		}
+		else
+		{
+			$objects[$class] = TRUE;
+		}
+	}
+	
+	
+	return $objects[$class];
+}
+
+/**
+* Loads the main config.php file
+*
+*
+* @access	private
+* @return	array
+*/
+function &_get_config()
+{
+	static $conf;
+	
+	if ( ! isset($conf))
+	{
+		require(APPPATH.'config/config'.EXT);
+		
+		if ( ! isset($config) OR ! is_array($config))
+		{
+			show_error('Your config file does not appear to be formatted correctly.');
+		}
+
+		$conf[0] =& $config;
+	}
+	return $conf[0];
+}
+
+
+/**
+* Error Handler
+*
+* This function lets us invoke the exception class and
+* display errors using the standard error template located 
+* in application/errors/errors.php
+* This function will send the error page directly to the 
+* browser and exit.
+*
+* @access	public
+* @return	void
+*/
+function show_error($message)
+{
+	if ( ! class_exists('CI_Exceptions'))
+	{
+		include_once(BASEPATH.'libraries/Exceptions.php');
+	}
+	
+	$error = new CI_Exceptions();
+	echo $error->show_error('An Error Was Encountered', $message);
+	exit;
+}
+
+
+/**
+* 404 Page Handler
+*
+* This function is similar to the show_error() function above
+* However, instead of the standard error template it displays
+* 404 errors.
+*
+* @access	public
+* @return	void
+*/
+function show_404($page = '')
+{
+	if ( ! class_exists('CI_Exceptions'))
+	{
+		include_once(BASEPATH.'libraries/Exceptions.php');
+	}
+	
+	$error = new CI_Exceptions();
+	$error->show_404($page);
+	exit;
+}
+
+
+/**
+* Error Logging Interface 
+*
+* We use this as a simple mechanism to access the logging
+* class and send messages to be logged.
+*
+* @access	public
+* @return	void
+*/
+function log_message($level = 2, $message, $php_error = FALSE)
+{
+	$config =& _get_config();
+	if ($config['log_errors'] === FALSE)
+	{
+		return;
+	}
+
+	if ( ! class_exists('CI_Log'))
+	{
+		include_once(BASEPATH.'libraries/Log.php');		
+	}
+	
+	if ( ! isset($LOG))
+	{
+		$LOG = new CI_Log(
+							$config['log_path'], 
+							$config['log_threshold'], 
+							$config['log_date_format']
+						);
+	}
+	
+	$LOG->write_log($level, $message, $php_error);
+}
+
+
+/**
+* Exception Handler
+*
+* This is the custom exception handler we defined at the
+* top of this file. The main reason we use this is permit 
+* PHP errors to be logged in our own log files since we may 
+* not have access to server logs. Since this function
+* effectively intercepts PHP errors, however, we also need
+* to display errors based on the current error_reporting level.
+* We do that with the use of a PHP error template.
+*
+* @access	private
+* @return	void
+*/
+function _exception_handler($severity, $message, $filepath, $line)
+{	
+	 // We don't bother with "strict" notices since they will fill up
+	 // the log file with information that isn't normally very
+	 // helpful.  For example, if you are running PHP 5 and you
+	 // use version 4 style class functions (without prefixes
+	 // like "public", "private", etc.) you'll get notices telling
+	 // you that these have been deprecated.
+	 
+	if ($severity == E_STRICT)
+	{
+		return;
+	}
+
+	// Send the PHP error to the log file...
+	if ( ! class_exists('CI_Exceptions'))
+	{
+		include_once(BASEPATH.'libraries/Exceptions.php');
+	}
+	$error = new CI_Exceptions();
+
+	// Should we display the error?  
+	// We'll get the current error_reporting level and add its bits
+	// with the severity bits to find out.
+	
+	if (($severity & error_reporting()) == $severity)
+	{
+		$error->show_php_error($severity, $message, $filepath, $line);
+	}
+	
+	// Should we log the error?  No?  We're done...
+	$config =& _get_config();
+	if ($config['log_errors'] === FALSE)
+	{
+		return;
+	}
+
+	$error->log_exception($severity, $message, $filepath, $line);
+}
+
+
+?>
\ No newline at end of file
diff --git a/system/codeigniter/index.html b/system/codeigniter/index.html
new file mode 100644
index 0000000..5a1f5d6
--- /dev/null
+++ b/system/codeigniter/index.html
@@ -0,0 +1,15 @@
+<html>
+
+<head>
+
+<title>403 Forbidden</title>
+
+</head>
+
+<body bgcolor='#ffffff'>
+
+<p>Directory access is forbidden.<p>
+
+</body>
+
+</html>
\ No newline at end of file
